<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>打开控制台查看结果</div>

    <script>
        console.log('============async函数的实现原理=============');
        /* 
           async函数的实现原理，就是将Generator函数和自动执行器，包装在一个函数里。
        */
       async function fn(args){
        // ...
       }
       // 等同于
       function fn(args) {
        return spawn(function* (){
            // .....
        })
       }
       /* 所有的async函数都可以写成上面的第二种形式，其中的spawn函数就是自动执行器。
          下面是spawn函数的实现，基本就是前文自动执行器的翻版。
       */
      function spawn(genF){
        return new Promise(function(resolve,reject){
            const gen = genF()
            function step(nexfF){
                let next;
                try {
                  next = nextF()
                } catch (e){
                  return reject(e)
                }
                if(next.done){
                    return resolve(next.value)
                }
                Promise.resolve(next.value).then(function(v) {
                    step(function() { return gen.next(v); });  // next()方法调用，通过参数返回结果
                },function(e){
                    step(function() { return gen.throw(e); });
                });
            }
            step(function() { return gen.next(undefined); });
        })
      }
    </script>
    
</body>
</html>